;(() => {
  // 类型推论
  // let name = 'lison'
  // let arr5: Array<number | string> = [5, 2, 2]
  // arr5 = [1, 2.3, '44']
  // window.onmousedown = function (mouseEvent: MouseEvent) {
  //   console.log(mouseEvent)
  // }
  // 类型兼容性
  // interface Info {
  //   name: string
  // }
  // let infos: Info
  // const infos1 = { name: 'lison' }
  // const infos2 = { age: 18 }
  // const infos3 = { name: 'lison', age: 18 }
  // infos = infos1
  // // infos = infos2 // 报错
  // infos = infos3
  // let x = (a: number) => 0
  // let y = (b: number, c: string) => 0
  // y = x
  // // x = y 报错 右边的参数个数要小于等于左边的参数个数
  // const arr = [1, 2, 3]
  // arr.forEach((item, index, target) => {
  //   console.log(item)
  // })
  // arr.forEach(item => {
  //   console.log(item)
  // })
  // 参数类型不一致也会报错
  // let x = (a: number) => 0
  // let y = (b: string) => 0
  // x = y
  // 可选参数和剩余参数
  // const getSum = (arr: number[], callback: (...args: number[]) => number) => {
  //   return callback(...arr)
  // }
  // // const callback = (...arg: number[]) => {
  // //   return arg.reduce((prve, item) => {
  // //     return prve + item
  // //   }, 0)
  // // }
  // // console.log(getSum([12, 33, 455, 552], callback))
  // console.log(
  //   getSum([1, 2, 3, 4, 5], (...arr: number[]) => {
  //     return arr.reduce((prev, cur) => prev + cur, 0)
  //   })
  // )
  // const res = getSum(
  //   [1, 2, 3, 4, 5, 6],
  //   (a: number, b: number, v: number, c: number, d: number) => a + b + v + c + d
  // )
  // console.log(res)
  // 函数参数双向协变
  // let funcA = (arg: number | string): void => {}
  // let funcB = (arg: number): void => {}
  // funcB = funcA
  // funcA = funcB
  // // // 返回值类型
  // let x = (): string | number => 0
  // let y = (): string => 'a'
  // let z = (): boolean => false
  // x = y
  // y = x
  // y = z
  // // 函数重载
  // function merge(arg1: number, arg2: number): number
  // function merge(arg1: string, arg2: string): string
  // function merge(arg1: any, arg2: any) {
  //   return arg1 + arg2
  // }
  // merge('2', '2').length
  // function sum(arg1: number, arg2: number): number
  // function sum(arg1: any, arg2: any): any {
  //   return arg1 + arg2
  // }
  // let func = merge
  // // func = sum
  // enum Status {
  //   On,
  //   Off,
  // }
  // enum Animal {
  //   Dog,
  //   Cat,
  // }
  // let s = Status.On
  // // s = 1
  // s = Animal.Dog
  // 类的兼容性
  // // 比较类的实例成员 类的静态成员和构造函数不进行比较
  // class AnimalClass {
  //   static age: number
  //   constructor(public name: string) {}
  // }
  // class PeopleClass {
  //   static age: string
  //   constructor(public name: string) {}
  // }
  // class FoodClass {
  //   constructor(public name: number) {}
  // }
  // let a: AnimalClass = new AnimalClass('222')
  // let p: PeopleClass = new PeopleClass('222')
  // let f: FoodClass = new FoodClass(222)
  // a = p
  // a = f //报错
  // provate
  // // protected
  // class ParentClass {
  //   private age!: number
  //   constructor() {}
  // }
  // class Children extends ParentClass {
  //   constructor() {
  //     super()
  //   }
  // }
  // class OtherClass {
  //   private age!: number
  //   constructor() {}
  // }
  // const childern: ParentClass = new Children()
  // console.log(childern)
  // const other:ParentClass = new OtherClass()
  // 泛型的兼容性
  // interface Data<T> {
  //   data: T
  // }
  // let data1!: Data<number>
  // let data2!: Data<string>
  // data1 = data2
})()
